/**
 * @Copyright ®2015 Sinosoft Co. Ltd. All rights reserved.<br/>
 * 项目名称 : 中科软支付平台
 * 创建日期 : 2016年12月14日
 * 修改历史 : 
 *     1. [2016年12月14日]创建文件 by liuyujia
 */
package com.sinosoft.sinopay.web.query.util;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.TreeMap;

import com.sinosoft.sinocloud.platform.common.exception.biz.BizDataErrException;
import com.sinosoft.sinocloud.platform.common.util.SecurityUtil;

/**  
 * 【支付签名】
 * @author dengcanyang
 * @date 2017年1月7日 下午20:42:04 
 * @version V1.0  
 */
public class MD5SignUtil {

	/** 分隔符 */
	private static final String signal ="|";
	/**
	 * 微信支付签名方法
	 * <p>对传入的数据进行哈希排序,然后通过signal连接符进行拼接后的字符串进行md5加密,返回加密签名信息</p>
	 * @param encryMsgs
	 * @param signKey
	 * @return
	 */
	public static String encryMD5(Map<String,String> encryMsgs,String signKey){
    	//校验信息完整性
        if(signKey==null || "".equals(signKey.trim()) || encryMsgs==null || encryMsgs.size()<1){
        	throw new BizDataErrException("签名信息不完整");
        }
    
        //首先对非空数据进行排序
        TreeMap<String,String> treeMap = new TreeMap<>();
        for (String tKey : encryMsgs.keySet()) {
            String tValue = encryMsgs.get(tKey);
            if(tValue!=null && !"".equals(tValue)){
                treeMap.put(tKey, encryMsgs.get(tKey));
            }
        }
        treeMap.put("key",signKey);
        //拼接字符串
        StringBuffer sb = new StringBuffer();
        for (String tKey : treeMap.keySet()) {
            sb.append(tKey);
            sb.append("=");
            sb.append(treeMap.get(tKey));
            sb.append(signal);
        }
        String tToEncryStr = sb.toString().substring(0, sb.length()-1);
        //签名
        String md5Check = SecurityUtil.Md5(tToEncryStr+signKey);
        return md5Check;
    }
	
	/**
     * 查询模块签名实现
     * <p>对传入的数据进行哈希排序,然后通过signal连接符进行拼接后的字符串进行md5加密,返回加密签名信息
     * @param encryMsgs
     * @param signKey
     * @return
     *//*
    public static String encryMD5( List< Map<String,String>> encryMsgs,String signKey){
        //校验信息完整性
        if(signKey==null || "".equals(signKey.trim()) || encryMsgs==null || encryMsgs.size()<1){
            throw new BizDataErrException("签名信息不完整");
        }
    
        //首先对非空数据进行排序
        TreeMap<String,String> treeMap = new TreeMap<>();
        for (int i = 0; i < encryMsgs.size(); i++) {
            for (String tKey : encryMsgs.get(i).keySet()) {
                String tValue = encryMsgs.get(i).get(tKey);
                if(tValue!=null && !"".equals(tValue)){
                    treeMap.put(tKey, encryMsgs.get(i).get(tKey));
                }
            }
        }
        
        treeMap.put("key",signKey);
        //拼接字符串
        StringBuffer sb = new StringBuffer();
        for (String tKey : treeMap.keySet()) {
            sb.append(tKey);
            sb.append("=");
            sb.append(treeMap.get(tKey));
            sb.append(signal);
        }
        String tToEncryStr = sb.toString().substring(0, sb.length()-1);
        //签名
        String md5Check = SecurityUtil.Md5(tToEncryStr+signKey);
        return md5Check;
    }*/
    
	/**
	 * 请求微信加密方法
	 * @param map
	 * @param key
	 * @return
	 */
	public static String getSign(Map<String,Object> map,String key){
        ArrayList<String> list = new ArrayList<String>();
        for(Map.Entry<String,Object> entry:map.entrySet()){
            if(entry.getValue()!=""){
                list.add(entry.getKey() + "=" + entry.getValue() + "&");
            }
        }
        int size = list.size();
        String [] arrayToSort = list.toArray(new String[size]);
        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < size; i ++) {
            sb.append(arrayToSort[i]);
        }
        String result = sb.toString();
        result += "key=" + key;
        result = SecurityUtil.Md5(result).toUpperCase();
        return result;
    }
}
